//package com.ruoyi.common.lock;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.data.redis.core.script.RedisScript;
//import org.springframework.stereotype.Component;
//
//import java.util.Collections;
//import java.util.concurrent.TimeUnit;
//
///**
// * 基于redis的分布式锁
// */
//@Component
//public class RedisLock {
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    /**
//     * 自旋加锁
//     * @param key
//     * @param value
//     * @return
//     */
//    public Boolean tryLock(String key, String value){
//        int count = 0;
//        while (true){
//            if(getLock(key, value)) return true;
//            if(count > 1000) break;
//            count ++ ;
//        }
//        return false;
//    }
//
//    /**
//     * redis加锁
//     * @param key
//     * @return
//     */
//    private Boolean getLock(String key, String value){
//        return redisTemplate.opsForValue().setIfAbsent(key, value, 5, TimeUnit.SECONDS);
//    }
//
//    /**
//     * 释放锁
//     * @param key
//     * @param value
//     * @return
//     */
//    public Long releaseLock(String key,String value){
//        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
//        RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript,Long.class);
//        Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value);
//        return releaseStatus;
//    }
//}
